package com.AdvancedDemos.FileAndIO;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class 使用try_with_resource改进文件拷贝 {
    public static void main(String[] args) {

        /*
        JDK8开始可以使用简化的资源释放操作
        try(
            资源对象1;
            资源对象2;
        ){
            使用资源的代码
        }catch(异常类 e){
            异常处理
        }
        没有finally,执行"使用资源的代码"后,会自动释放资源

        无需手动关闭流释放资源
        from.close();
        to.close();*/

        //1.单字节拷贝文件
        File file = new File("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\from\\test.png");
//---------------------------------------------------------------------------
        try (FileInputStream from = new FileInputStream(file);
             FileOutputStream to = new FileOutputStream("helloworld\\src\\com\\AdvancedDemos\\FileAndIO\\to\\copy.png");) {
//---------------------------------------------------------------------------

            //helloworld\src\com\AdvancedDemos\FileAndIO\from
            //helloworld\src\com\AdvancedDemos\FileAndIO\to
            //从from中拷贝文件到to
            //拷贝的文件和原始文件大小要完全相同,要可用


//        if (file.length() > Integer.MAX_VALUE) {
//            throw new RuntimeException("文件过大");
//        }


//        byte[] froms = from.readAllBytes();//使用readAllBytes要注意文件不能过大两个多G
            byte[] bytes = new byte[1024 * 1024];//每次读1MB
            int count;
            while ((count = from.read(bytes)) != -1) {
                System.out.println("本次读取到" + count / 1024 + "KB");//本次读取到745KB
                to.write(bytes, 0, count);//只能写入实际读到的count个字节,如果把bytes全部写入,最后一次可能会写入脏数据
            }
//---------------------------------------------------------------------------
        } catch (IOException e) {
            e.printStackTrace();
        }
//---------------------------------------------------------------------------

    }
}
